package com.cn.wanxi.util;

import com.alibaba.fastjson.JSONObject;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/*")
public class MyFilter implements Filter {
    /**
     * 项目启动的时候去执行的方法，只执行一次
     * 定时器
     *
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /**
     * 每一次访问后台链接的时候都会执行这里的语句
     * 这里才是真正的过滤器
     * 通过地址访问后台？截取地址？根据地址去判断当前用户是否有权限访问
     * 因为有些地址不需要截取，直接放行
     * 这里判断用户是否登录，如果已经登陆则放行当前连接，可以访问后台
     * 如果没有登录，则直接让用户返回到登录页面，或者提示用户需要登录
     *
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        String path = req.getServletPath();
        System.out.println(path);
//        检查所有访问后台链接的地址是否是以back开头的，如果是则，必须检查是否已经登录
        if (path.startsWith("/back/")) {
            String reqName = req.getParameter("loginName");//前端传递登录用户
//            在session里面去查询是否有这个用户名
            String loginName = (String) req.getSession().getAttribute(reqName);
            if (loginName == null) {
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("code", -1);
                jsonObject.put("result", "你还未登录，请先登录");
                resp.getWriter().println(jsonObject);
            } else {
                filterChain.doFilter(req, resp);//放行
            }

        } else {
            filterChain.doFilter(req, resp);//放行
        }

    }

    @Override
    public void destroy() {

    }
}
